package cl.loso.melon.server.persistencia;

import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import cl.loso.melon.server.model.NegocioLVS;
import cl.loso.melon.server.model.UsuarioLVS;
import cl.loso.melon.server.model.VisitaLVS;
import cl.loso.melon.server.negocio.NegocioLVSBO;
import cl.loso.melon.server.pojos.VisitaLVS2;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.FetchOptions;
import com.google.appengine.api.datastore.PreparedQuery;
import com.google.appengine.api.datastore.Query;

public class ReporteHomeDAO {
	private static Log log = LogFactory.getLog(ReporteHomeDAO.class);

	public static VisitaLVS2 Reporte2(Date fecha_ini, Date fecha_ter,
			String idNegocio) throws Exception {
		VisitaLVS2 visita = null;

		long tseguro = 0;
		long tinseguro = 0;
		long duracion = 0;

		try {
			NegocioLVS negocio = NegocioLVSBO.editarNegocioLVS(idNegocio);

			DatastoreService datastore = DatastoreServiceFactory
					.getDatastoreService();

			Query q = new Query(VisitaLVS.class.getSimpleName());

			q.addFilter("fecha", Query.FilterOperator.GREATER_THAN_OR_EQUAL,
					fecha_ini);

			q.addFilter("fecha", Query.FilterOperator.LESS_THAN_OR_EQUAL,
					fecha_ter);

			q.addFilter("negocio", Query.FilterOperator.EQUAL, Long
					.valueOf(idNegocio));

			FetchOptions fetchOptions = FetchOptions.Builder.withDefaults();

			PreparedQuery pq = datastore.prepare(q);
			//int count = pq.countEntities(fetchOptions);

			visita = new VisitaLVS2();

			for (Entity result : pq.asIterable()) {

				tseguro = ((Long) result.getProperty("tseguro")).longValue()
						+ tseguro;
				tinseguro = ((Long) result.getProperty("tinseguro"))
						.longValue()
						+ tinseguro;

				duracion = ((Long) result.getProperty("duracion")).longValue()
						+ duracion;

			}
			Float meta = obtenerTotalMeta(fecha_ini, fecha_ter, idNegocio);
			if (meta != null) {
				visita.setTmeta(meta.longValue());
			} else {
				visita.setTmeta(0);
			}
			visita.setNombreNegocio(negocio.getNombre());
			visita.setTinseguro(tinseguro);
			visita.setTseguro(tseguro);
			visita.setDuracion(duracion);

		} catch (Exception e) {
			log.error("ReporteHomeDAO :" + e.getMessage());
			throw e;
		}
		return visita;
	}


	public static Float obtenerTotalMeta(Date fecha_ini, Date fecha_ter,
			String idNegocio) throws Exception {
		float meta = 0;
		List<UsuarioLVS> usuarioList = UsuarioLVSDAO
				.buscarUsuarioPorNegocio(Long.valueOf(idNegocio));

		if (!usuarioList.isEmpty()) {
			Iterator<UsuarioLVS> ite = usuarioList.iterator();
			while (ite.hasNext()) {
				UsuarioLVS usuario = ite.next();

				meta = meta
						+ MetaLVSDAO.obtenerTotalMeta(fecha_ini, fecha_ter,
								usuario).floatValue();
			}
		}
		log.info("negocio: " + idNegocio + " total meta: " + meta);
		return meta;

	}

}
